package com.eduagent.xwqeduagent.api.imageTranslation;

import com.eduagent.xwqeduagent.api.imageTranslation.api.ImageTranslationApi;
import com.eduagent.xwqeduagent.api.imageTranslation.api.ImageTranslationApiImpl;
import com.eduagent.xwqeduagent.api.imageTranslation.constant.ImageTranslationConstant;
import com.eduagent.xwqeduagent.api.imageTranslation.model.ImageInfo;
import com.eduagent.xwqeduagent.api.imageTranslation.model.ImageTranslationRequest;
import com.eduagent.xwqeduagent.api.imageTranslation.model.ImageTranslationResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.File;
import java.io.InputStream;

/**
 * 图片翻译客户端
 */
@Slf4j
@Component
public class ImageTranslationClient {

    private final ImageTranslationApi api;

    /**
     * 构造函数
     *
     * @param apiKey API密钥
     * @param appId 应用ID
     */
    public ImageTranslationClient(@Value("${niutrans.image.apiKey}") String apiKey,
                                @Value("${niutrans.image.appId}") String appId) {
        this.api = new ImageTranslationApiImpl(apiKey, appId);
    }

    /**
     * 上传并翻译图片
     *
     * @param request 图片翻译请求
     * @return 文件编号（如果成功）
     */
    public String uploadAndTranslate(ImageTranslationRequest request) {
        try {
            ImageTranslationResponse response = api.uploadAndTranslate(
                    request.getFrom(),
                    request.getTo(),
                    request.getFile(),
                    request.getBase64(),
                    request.getRealmCode(),
                    request.getTermId(),
                    request.getMemoryId()
            );

            if (response.getCode() == 200 && response.getData() != null) {
                // 获取fileNo
                if (response.getData() instanceof java.util.Map) {
                    @SuppressWarnings("unchecked")
                    java.util.Map<String, String> dataMap = (java.util.Map<String, String>) response.getData();
                    return dataMap.get("fileNo");
                } else {
                    // 尝试从字符串解析
                    String dataStr = response.getData().toString();
                    return dataStr.replaceAll(".*fileNo=([^,}]+).*", "$1");
                }
            } else {
                log.error("图片翻译失败: {}", response.getMsg());
                return null;
            }
        } catch (Exception e) {
            log.error("图片翻译异常: {}", e.getMessage(), e);
            return null;
        }
    }

    /**
     * 获取图片翻译信息
     *
     * @param fileNo 文件编号
     * @return 图片信息
     */
    public ImageInfo getImageInfo(String fileNo) {
        return api.getImageInfo(fileNo);
    }

    /**
     * 中断图片翻译
     *
     * @param fileNo 文件编号
     * @return 是否成功中断
     */
    public boolean interruptTranslation(String fileNo) {
        return api.interruptTranslation(fileNo);
    }

    /**
     * 获取图片下载链接
     *
     * @param fileNo 文件编号
     * @param type 下载类型
     * @return 下载链接
     */
    public String getDownloadUrl(String fileNo, Integer type) {
        return api.getDownloadUrl(fileNo, type);
    }

    /**
     * 获取翻译后图片的下载链接
     *
     * @param fileNo 文件编号
     * @return 下载链接
     */
    public String getTranslatedImageUrl(String fileNo) {
        return api.getDownloadUrl(fileNo, ImageTranslationConstant.DownloadType.TRANSLATED);
    }

    /**
     * 下载图片
     *
     * @param fileNo 文件编号
     * @param type 下载类型
     * @return 图片输入流
     */
    public InputStream downloadImage(String fileNo, Integer type) {
        return api.downloadImage(fileNo, type);
    }

    /**
     * 删除图片翻译文件
     *
     * @param fileNo 文件编号
     * @return 是否成功删除
     */
    public boolean deleteImage(String fileNo) {
        return api.deleteImage(fileNo);
    }

    /**
     * 同步翻译图片
     *
     * @param request 图片翻译请求
     * @return 翻译结果（根据resultType可能是流或base64）
     */
    public Object translateImageSync(ImageTranslationRequest request) {
        return api.translateImageSync(
                request.getFrom(),
                request.getTo(),
                request.getFile(),
                request.getBase64(),
                request.getResultType(),
                request.getRealmCode(),
                request.getTermId(),
                request.getMemoryId()
        );
    }

    /**
     * 等待图片翻译完成
     *
     * @param fileNo 文件编号
     * @param pollingIntervalMs 轮询间隔（毫秒）
     * @param timeoutMs 超时时间（毫秒）
     * @return 图片信息（如果翻译完成），null表示超时或失败
     */
    public ImageInfo waitForTranslation(String fileNo, long pollingIntervalMs, long timeoutMs) {
        long startTime = System.currentTimeMillis();
        ImageInfo info = null;
        
        while (System.currentTimeMillis() - startTime < timeoutMs) {
            info = getImageInfo(fileNo);
            
            if (info == null) {
                log.error("获取图片翻译状态失败，fileNo: {}", fileNo);
                return null;
            }
            
            // 检查翻译状态
            if (info.getTransStatus() == ImageTranslationConstant.TranslationStatus.SUCCESS) {
                log.info("图片翻译完成，fileNo: {}", fileNo);
                return info;
            } else if (info.getTransStatus() == ImageTranslationConstant.TranslationStatus.FAILURE) {
                log.error("图片翻译失败，fileNo: {}, 失败原因: {}", fileNo, info.getTransFailureCause());
                return info;
            } else if (info.getTransStatus() == ImageTranslationConstant.TranslationStatus.TERMINATED) {
                log.warn("图片翻译已终止，fileNo: {}", fileNo);
                return info;
            }
            
            // 仍在进行中，等待并重试
            log.debug("图片翻译进行中，fileNo: {}, 状态: {}, 进度: {}", fileNo, info.getTransStatus(), info.getProgress());
            
            try {
                Thread.sleep(pollingIntervalMs);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                log.warn("等待图片翻译完成时被中断");
                return info;
            }
        }
        
        log.warn("等待图片翻译超时，fileNo: {}", fileNo);
        return info;
    }
} 